package top.gokzzz.common.utils;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Map 工具類
 *
 * @author Gok
 * @version 1.0
 */
public class MapUtil {

    /**
     * 是否為空
     *
     * @param map Map 對象
     * @return 是否為空
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return null == map || map.isEmpty();
    }

    /**
     * 是否不為空
     *
     * @param map Map 對象
     * @return 是否為空
     */
    public static boolean isNotEmpty(Map<?, ?> map) {
        return !isEmpty(map);
    }

    /**
     * 創建一個 MapBuilder 對象（默認使用 HashMap）
     *
     * @param <K> 鍵的類型
     * @param <V> 值的類型
     * @return MapBuilder 對象
     */
    public static <K, V> MapBuilder<K, V> newMap() {
        return new MapBuilder<>();
    }

    /**
     * 創建一個 MapBuilder 對象（指定使用 LinkedHashMap）
     *
     * @param <K> 鍵的類型
     * @param <V> 值的類型
     * @return MapBuilder 對象
     */
    public static <K, V> MapBuilder<K, V> newLinkedMap() {
        return new MapBuilder<>(true);
    }

    /**
     * Map 建造者類
     */
    public static class MapBuilder<K, V> {
        private final Map<K, V> map;

        /**
         * 默認構造函數，使用 HashMap
         */
        public MapBuilder() {
            this.map = new HashMap<>();
        }

        /**
         * 構造函數，根據參數選擇使用 HashMap 或 LinkedHashMap
         *
         * @param useLinkedHashMap 是否使用 LinkedHashMap
         */
        public MapBuilder(boolean useLinkedHashMap) {
            this.map = useLinkedHashMap ? new LinkedHashMap<>() : new HashMap<>();
        }

        /**
         * 添加鍵值對到 Map 中
         *
         * @param key   鍵
         * @param value 值
         * @return 當前的 MapBuilder 對象
         */
        public MapBuilder<K, V> put(K key, V value) {
            map.put(key, value);
            return this;
        }

        /**
         * 構建並返回最終的 Map 對象
         *
         * @return 構建完成的 Map 對象
         */
        public Map<K, V> build() {
            return map;
        }
    }

}
